#ifndef MESSAGESHOWAREA_H
#define MESSAGESHOWAREA_H

#include <QScrollArea>
#include <QWidget>
#include <QPushButton>
#include <QLabel>


#include "model/data.h"

using model::Message;

/*
 * 消息展示区
*/
class MessageShowArea : public QScrollArea
{
    Q_OBJECT
public:
    MessageShowArea(QWidget* parent = nullptr);

    //新增一个消息(尾插)
    void addMessage(bool isLeft,const Message& message);

    //新增一个消息(头插)
    void addFrontMessage(bool isLeft,const Message& message);

    //清空所有的消息
    void clear();

    //设置滚动条滚动到末尾
    void scrollToEndLater();

private:
    QWidget* container;
};

/*
 * 表示一个消息
 * 里面包括  文本、语音、图片 文件
 *
*/
class MessageItem : public QWidget
{
    Q_OBJECT
public:
    MessageItem(bool isLeft);

    //工厂模式创建MessageItem
    static MessageItem* messageItemFactory(bool isLeft,const model::Message& message);

    //创建对应的消息类型
    static QWidget* createTextMessageItem(bool isLeft,const QString& text);
    static QWidget* createImageMessageItem(bool isLeft,const QString& fileId,const QByteArray& content);
    static QWidget* createFileMessageItem(bool isLeft,const Message& message);
    static QWidget* createSpeechMessageItem(bool isLeft,const Message& message);
private:
    //确定是否是发送消息的一方
    bool isLeft;
};

/*
 * 表示消息的正文
 *
 */

class MessageContentLabel : public QWidget {
    Q_OBJECT
public:
    // fileName 可以作为 text 的一部分, 传递进来. 不需要单独列一个参数
    MessageContentLabel(const QString& text, bool isLeft, model::MessageType messageType, const QString& fileId,
                        const QByteArray& content);

    void paintEvent(QPaintEvent* event) override;
    void mousePressEvent(QMouseEvent* event) override;

    void updateUI(const QString& fileId, const QByteArray& fileContent);
    // 另存为文件
    void saveAsFile(const QByteArray& content);

    void playDone();

    // 上下文菜单
    void contextMenuEvent(QContextMenuEvent* event) override;
    void speechConvertTextDone(const QString& fileId, const QString& text);

private:
    QLabel* label;
    bool isLeft;

    model::MessageType messageType;
    QString fileId;
    QByteArray content;

    // 用变量来控制传输空文件情况
    bool loadContentDone = false;
};

class MessageImageLabel : public QWidget {
    Q_OBJECT

public:
    MessageImageLabel(const QString& fileId, const QByteArray& content, bool isLeft);

    void updateUI(const QString& fileId, const QByteArray& content);
    void paintEvent(QPaintEvent* event);

private:
    QPushButton* imageBtn;

    QString fileId;  		// 该图片在服务器对应的文件 id.
    QByteArray content;		// 图片的二进制数据
    bool isLeft;
};

#endif // MESSAGESHOWAREA_H
